Grab_LineStart.py

线阵相机线程取图

该示例程序演示在指定线程设置线阵相机取流。

1 # -- coding: utf-8 --
2 
3 import sys
4 import threading
5 import msvcrt
6 import os
7 sys.path.append(os.getenv('MVCAM_COMMON_RUNENV') + "/Samples/Python/MvImport")
8 from MvCameraControl_class import *
9 
10 g_bExit = False
11 
12 
13 # 为线程定义一个函数
14 def work_thread(cam=0, pData=0, nDataSize=0):
15  out_frame_info = MV_FRAME_OUT()
16  memset(byref(out_frame_info), 0, sizeof(out_frame_info))
17  while True:
18  ret = cam.MV_CC_GetImageBuffer(out_frame_info, 1000)
19  if out_frame_info.pBufAddr is not None and 0 == ret:
20  print("get one frame: Width[%d], Height[%d], nFrameNum[%d]" % (
21  out_frame_info.stFrameInfo.nWidth, out_frame_info.stFrameInfo.nHeight,
22  out_frame_info.stFrameInfo.nFrameNum))
23  ret = cam.MV_CC_FreeImageBuffer(out_frame_info)
24  else:
25  print("error: no data[0x%x]" % ret)
26  if g_bExit is True:
27  break
28 
29 
30 if __name__ == "__main__":
31 
32  # ch:初始化SDK | en: initialize SDK
33  MvCamera.MV_CC_Initialize()
34 
35  device_list = MV_CC_DEVICE_INFO_LIST()
36  t_layer_type = (MV_GIGE_DEVICE | MV_USB_DEVICE | MV_GENTL_CAMERALINK_DEVICE
37  | MV_GENTL_CXP_DEVICE | MV_GENTL_XOF_DEVICE)
38 
39  # ch:枚举设备 | en:Enum device
40  ret = MvCamera.MV_CC_EnumDevices(t_layer_type, device_list)
41  if ret != 0:
42  print("error: enum devices fail! ret[0x%x]" % ret)
43  sys.exit()
44 
45  if device_list.nDeviceNum == 0:
46  print("find no device!")
47  sys.exit()
48 
49  print("Find %d devices!" % device_list.nDeviceNum)
50 
51  for i in range(0, device_list.nDeviceNum):
52  mvcc_dev_info = cast(device_list.pDeviceInfo[i], POINTER(MV_CC_DEVICE_INFO)).contents
53  if mvcc_dev_info.nTLayerType == MV_GIGE_DEVICE or mvcc_dev_info.nTLayerType == MV_GENTL_GIGE_DEVICE:
54  print("gige device: [%d]" % i)
55  device_model_name = ""
56  for per in mvcc_dev_info.SpecialInfo.stGigEInfo.chModelName:
57  if per == 0:
58  break
59  device_model_name = device_model_name + chr(per)
60  print("device model name: %s" % device_model_name)
61 
62  nip1 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0xff000000) >> 24)
63  nip2 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x00ff0000) >> 16)
64  nip3 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x0000ff00) >> 8)
65  nip4 = (mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x000000ff)
66  print("current ip: %d.%d.%d.%d" % (nip1, nip2, nip3, nip4))
67  elif mvcc_dev_info.nTLayerType == MV_USB_DEVICE:
68  print("u3v device: [%d]" % i)
69  device_model_name = ""
70  for per in mvcc_dev_info.SpecialInfo.stUsb3VInfo.chModelName:
71  if per == 0:
72  break
73  device_model_name = device_model_name + chr(per)
74  print("device model name: %s" % device_model_name)
75 
76  serial_number = ""
77  for per in mvcc_dev_info.SpecialInfo.stUsb3VInfo.chSerialNumber:
78  if per == 0:
79  break
80  serial_number = serial_number + chr(per)
81  print("user serial number: %s" % serial_number)
82  elif mvcc_dev_info.nTLayerType == MV_GENTL_CAMERALINK_DEVICE:
83  print ("\nCML device: [%d]" % i)
84  strModeName = ""
85  for per in mvcc_dev_info.SpecialInfo.stCMLInfo.chModelName:
86  if per == 0:
87  break
88  strModeName = strModeName + chr(per)
89  print ("device model name: %s" % strModeName)
90 
91  strSerialNumber = ""
92  for per in mvcc_dev_info.SpecialInfo.stCMLInfo.chSerialNumber:
93  if per == 0:
94  break
95  strSerialNumber = strSerialNumber + chr(per)
96  print ("user serial number: %s" % strSerialNumber)
97  elif mvcc_dev_info.nTLayerType == MV_GENTL_CXP_DEVICE:
98  print ("\nCXP device: [%d]" % i)
99  strModeName = ""
100  for per in mvcc_dev_info.SpecialInfo.stCXPInfo.chModelName:
101  if per == 0:
102  break
103  strModeName = strModeName + chr(per)
104  print ("device model name: %s" % strModeName)
105 
106  strSerialNumber = ""
107  for per in mvcc_dev_info.SpecialInfo.stCXPInfo.chSerialNumber:
108  if per == 0:
109  break
110  strSerialNumber = strSerialNumber + chr(per)
111  print ("user serial number: %s" % strSerialNumber)
112  elif mvcc_dev_info.nTLayerType == MV_GENTL_XOF_DEVICE:
113  print ("\nXoF device: [%d]" % i)
114  strModeName = ""
115  for per in mvcc_dev_info.SpecialInfo.stXoFInfo.chModelName:
116  if per == 0:
117  break
118  strModeName = strModeName + chr(per)
119  print ("device model name: %s" % strModeName)
120 
121  strSerialNumber = ""
122  for per in mvcc_dev_info.SpecialInfo.stXoFInfo.chSerialNumber:
123  if per == 0:
124  break
125  strSerialNumber = strSerialNumber + chr(per)
126  print ("user serial number: %s" % strSerialNumber)
127 
128  connection_number = input("please input the number of the device to connect:")
129 
130  if int(connection_number) >= device_list.nDeviceNum:
131  print("error: input error!")
132  sys.exit()
133 
134  # ch:创建相机实例 | en:Creat Camera Object
135  cam = MvCamera()
136 
137  # ch:选择设备并创建句柄 | en:Select device and create handle
138  current_device_info = cast(device_list.pDeviceInfo[int(connection_number)], POINTER(MV_CC_DEVICE_INFO)).contents
139 
140  ret = cam.MV_CC_CreateHandle(current_device_info)
141  if ret != 0:
142  print("error: create handle fail! ret[0x%x]" % ret)
143  sys.exit()
144 
145  # ch:打开设备 | en:Open device
146  ret = cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)
147  if ret != 0:
148  print("error: open device fail! ret[0x%x]" % ret)
149  sys.exit()
150 
151  # ch:探测网络最佳包大小(只对GigE相机有效) | en:Detection network optimal package size(It only works for the GigE camera)
152  if current_device_info.nTLayerType == MV_GIGE_DEVICE or current_device_info.nTLayerType == MV_GENTL_GIGE_DEVICE:
153  nPacketSize = cam.MV_CC_GetOptimalPacketSize()
154  if int(nPacketSize) > 0:
155  ret = cam.MV_CC_SetIntValue("GevSCPSPacketSize", nPacketSize)
156  if ret != 0:
157  print("Warning: Set Packet Size fail! ret[0x%x]" % ret)
158  else:
159  print("Warning: Get Packet Size fail! ret[0x%x]" % nPacketSize)
160 
161  b_enable = c_bool(False)
162  ret = cam.MV_CC_GetBoolValue("AcquisitionLineRateEnable", b_enable)
163  if ret != 0:
164  print("error: get AcquisitionLineRateEnable fail! ret[0x%x]" % ret)
165 
166  # ch:设置行触发 | en:Set trigger selector is line start
167  ret = cam.MV_CC_SetEnumValueByString("TriggerSelector", "LineStart")
168  if ret != 0:
169  print("error: set trigger selector fail! ret[0x%x]" % ret)
170  sys.exit()
171 
172  # ch:设置触发模式为On | en:Set trigger mode as on
173  ret = cam.MV_CC_SetEnumValue("TriggerMode", MV_TRIGGER_MODE_ON)
174  if ret != 0:
175  print("error: set trigger mode fail! ret[0x%x]" % ret)
176  sys.exit()
177 
178  # ch:设置触发源 | en:Set trigger source
179  ret = cam.MV_CC_SetEnumValue("TriggerSource", MV_TRIGGER_SOURCE_LINE1)
180  if ret != 0:
181  print("error: set trigger source fail! ret[0x%x]" % ret)
182  sys.exit()
183 
184  # ch:开始取流 | en:Start grab image
185  ret = cam.MV_CC_StartGrabbing()
186  if ret != 0:
187  print("error: start grabbing fail! ret[0x%x]" % ret)
188  sys.exit()
189 
190  try:
191  thread_handle = threading.Thread(target=work_thread, args=(cam, None, None))
192  thread_handle.start()
193  except:
194  print("error: unable to start thread")
195 
196  print("press a key to stop grabbing.")
197  msvcrt.getch()
198 
199  g_bExit = True
200  thread_handle.join()
201 
202  # ch:停止取流 | en:Stop grab image
203  ret = cam.MV_CC_StopGrabbing()
204  if ret != 0:
205  print("error: stop grabbing fail! ret[0x%x]" % ret)
206  sys.exit()
207 
208  # ch:关闭设备 | Close device
209  ret = cam.MV_CC_CloseDevice()
210  if ret != 0:
211  print("error: close device fail! ret[0x%x]" % ret)
212  sys.exit()
213 
214  # ch:销毁句柄 | Destroy handle
215  ret = cam.MV_CC_DestroyHandle()
216  if ret != 0:
217  print("error: destroy handle fail! ret[0x%x]" % ret)
218  sys.exit()
219 
220  # ch:反初始化SDK | en: finalize SDK
221  MvCamera.MV_CC_Finalize()